package cn.com.yang.queue;

import java.util.concurrent.ArrayBlockingQueue;  

/**
 * 阻塞队列示例
 * TODO
 * @author yangyijin
 * @since 2024年8月15日-下午4:55:21
 */
public class ArrayBlockingQueueExample {  
    public static void main(String[] args) throws InterruptedException {  
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);  
  
        // 生产者  
        Thread producer = new Thread(() -> {  
            for (int i = 0; i < 20; i++) {  
                try {  
                    queue.put(i);  
                    System.out.println("Produced: " + i);  
                    Thread.sleep(100); // 模拟耗时操作  
                } catch (InterruptedException e) {  
                    Thread.currentThread().interrupt();  
                }  
            }  
        });  
  
        // 消费者  
        Thread consumer = new Thread(() -> {  
            while (true) {  
                try {  
                    int item = queue.take(); // 如果队列为空，会阻塞等待  
                    System.out.println("Consumed: " + item);  
                    Thread.sleep(200); // 模拟耗时操作  
                } catch (InterruptedException e) {  
                    Thread.currentThread().interrupt();  
                    break; // 退出循环  
                }  
            }  
        });  
  
        producer.start();  
        consumer.start();  
  
        // 等待生产者线程结束  
        producer.join();  
  
        // 停止消费者线程，这里只是简单示例，实际应用中可能需要更复杂的逻辑来优雅地停止线程  
        consumer.interrupt();  
    }  
}
